package com.fun.demo.juc;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * 该类用于控制信号量的个数，构造时传入个数。总数就是控制并发的数量。假如是 5，
 * 程序执 行前用 acquire()方法获得信号，则可用信号变为 4，程序执行完通过
 * release()方法归还信号量，可用 信号又变为 5.如果可用信号为 0，acquire
 * 就会造成阻塞，等待 release 释放信号。acquire 和 release 方法可以不在
 * 同一个线程使用。Semaphore 实现的功能就类似厕所有 5 个坑，假如有 10 个
 * 人要上厕 所，那么同时只能有多少个人去上厕所呢？同时只能有 5 个人能够占用，
 * 当 5 个人中 的任何一个人 让开后，其中等待的另外 5 个人中又有一个人可以占
 * 用了。另外等待的 5 个人中可以是随机获得优先 机会，也可以是按照先来后到的
 * 顺序获得机会，这取决于构造 Semaphore 对象时传入的参数选项。 单个信号量
 * 的 Semaphore 对象可以实现互斥锁的功能，并且可以是由一个线程获得了“锁”，
 * 再由另 一个线程释放“锁”，这可应用于死锁恢复的一些场合
 *
 * */
public class XSemaphore {
    public static void main(String[] args) throws InterruptedException {
        Semaphore semaphore = new Semaphore(5);

        for (int i = 0; i < 10; i++) {
            if(i < 5) semaphore.acquire(1);
            System.out.println(i + " : " +semaphore.availablePermits());
            if(i >= 5){
                semaphore.release(1);
                System.out.println("release");
            }
            Thread.sleep(1000);
        }
    }
}
